#pragma once
#include "glm/glm.hpp"
using namespace glm;

class Camera{
public:
	Camera(vec4 _pos, int _w, int _h, int _d, float _fov);
	~Camera();

	void lookAt(vec4 _from, vec4 _at, vec4 _up);

	vec4 position(){ return pos; }
	void position(vec4 _pos){ pos = _pos; }
	//translates the camera's position by the xyz values in the value
	void translate(vec4);

	int scWidth(){ return scW; }
	void scWidth(int);

	int scHeight(){ return scH;	}
	void scHeight(int);

	int scDepth(){ return scD; }
	void scDepth(int _d);

	float h_fov(){ return fov; }
	float v_fov(){ return vertical_fov; }
	float d_fov(){ return depth_fov; }
	
	void FoV(float);

	vec3 aspect(){ return aspct; }
	void aspect(vec3 _a);

	vec4 up(){ return upVec; }

	vec4 target(){ return targetVec; }


private:
	void updateMatrix();	//update the viewing transform
	
	//float heading; //? or should I do this with a vector?

	int scW;
	int scH;
	int scD;

	float fov;			//in degrees
	float vertical_fov;	//in degrees
	float depth_fov;	//in degrees
	vec3 aspct;

	vec4 pos;
	vec4 targetVec;		//where the camera is looking
	vec4 upVec;			//which way is 'up'
};

